package thread;

public class Demo10 {
    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            //这个代码在 lambda 中(也就是 t 线程的入口方法中) 调用的 返回值为t
            //Thread.currentThread() 指当前的线程 t
            //System.out.println("t:"+Thread.currentThread().getName());
            while (!Thread.currentThread().isInterrupted()/*判定当前线程是否终止*/){
                System.out.println("Hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    /*e.printStackTrace();当 t 线程在执行 Thread.sleep(1000) 的时候，
                    如果主线程调用了 t.interrupt()，此时 sleep() 方法会抛出一个 InterruptedException，
                    并且 t 线程会捕获该异常，执行 catch 块中的代码。此时，t 线程并没有再次检查中断状态，
                    因此  while (!Thread.currentThread().isInterrupted())
                    在捕获异常后并不是自动变为 false，t 线程就会继续执行，导致继续打印 Hello thread*/
                    //throw new RuntimeException(e);
                    /*在某些情况下（如 Thread.sleep()、Object.wait()、Thread.join() 等线程阻塞方法），当线程被中断时，
                    将抛出 InterruptedException。在捕获该异常后，线程的中断状态将自动被清除，
                    也就是说，再次调用 isInterrupted() 会返回 false*/
                    break;//如果不使用break 第一次调用t.interrupt()时
                    // isInterrupted()会被设置为true 但是sleep会被提前唤醒此时sleep会把isInterrupted()标志位设回为false
                }
            }
            System.out.println("t线程结束");
        });
        t.start();
        //System.out.println("main:"+Thread.currentThread().getName());//指当前线程 返回值 main
        Thread.sleep(3000);
        System.out.println("main线程尝试终止t线程");
        t.interrupt();//中断任务线程
        //t.interrupt();//再次调用才结束
    }
}
